package cn.desk.commons.service;

import java.util.List;

import cn.desk.commons.entity.BaseEntity;
import cn.desk.commons.entity.PageMode;
import cn.desk.commons.exception.DeskException;

public interface IBaseService<T extends BaseEntity> {
	
	/**
	 * 根据实体t中的属性查询
	 * @param t
	 * @return 返回查询到的数据
	 */
	public List<T> list(T t);
 
	/**
	 * @param page 前台提交的当前页，页面的记录数
	 * @param t 查询条件
	 * @return 返回得到的页数以及数据
	 */
	PageMode<T> listPage(PageMode<T> page,T t);
	
	/**
	 * 将t保存到数据库中
	 * @param t 要添加的对象
	 * @throws DeskException
	 */
	public void add(T t) throws DeskException;
	
	/**
	 * 更新t
	 * @param t 要更新的对象
	 * @throws DeskException
	 */
	void update(T t) throws DeskException;
	
	/**
	 * 删除t
	 * @param t 要删除的对象
	 * @throws DeskException
	 */
	void delete(T t) throws DeskException;

	/**
	 * 根据t的主键查询T对象
	 * @param t 对象
	 * @return 根据主键查到的对象
	 * @throws DeskException
	 */
	public T load(T t) throws DeskException;
	
	/**
	 * @param clazz 要查询的Entity的Class对象
	 * @param property 匹配的属性
	 * @param dependencies 这个属性允许的值
	 * @return 返回查到的对象集合
	 */
	public List<T> listInByProperty(final Class<?> clazz,final String property, final String[] dependencies);
	
	/**
	 * @param clazz 要查询的Entity的Class对象
	 * @param property 匹配的属性
	 * @param value 匹配的对象
	 * @return 返回查到的对象集合
	 */
	public List<T> listByProperty(final Class<?> clazz,final String property, Object value);
	
	/**
	 * @param clazz 要查询的Entity的Class对象
	 * @param property 匹配的属性
	 * @return 返回最大值 如果没有则返回null
	 */
	public String getMax(final Class<?> clazz, final String property) ;

	/**
	 * @param page 前台提交的当前页，页面的记录数
	 * @param t 查询条件
	 * @param desc 排序
	 * @return 返回得到的页数以及数据
	 */
	PageMode<T> listPage(PageMode<T> page, T t,String desc);

	/**
	 * @param clazz 要查询的Entity的Class对象
	 * @return 返回查到id的最大值，如果没有返回0
	 */
	Integer getNextId(Class<?> clazz);

	/**
	 * 级联修改对象
	 * @param t 要更新的对象
	 */
	void merge(T t);
}
